<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // https://www.baidu.com:8081/html5

        // https  协议
        // www.baidu.com  域名
        // 8081 端口号
        // html5 路径 


        // https
        // https://www.baidu.com
        // https://www.baidu.com:8081
        // https://www.baidu.com:8081/html5  ok


        // https://www.baidu.com:8081/html5
        // https://www.baidu.com:8081/java
        // https://www.baidu.com:8081/linux


        // 如果你的参数不够  需要继续输入 够了直接返回 

        // 准备一个功能给函数  (如果达到标准 输出 达不到标准 继续让用户输入)

        // function fn1(one,two,three,four){
        //     return one +'://'+two+':'+three+'/'+four
        // }


        // 如何判断是否达到标准?
        // 上面功能函数要求 4个参数 只要参数4个就达到要求了  
        // 函数.length   
        // 返回值: 改函数的形参个数  

        // alert(fn.length); // 4


        // function test1(num1,num2,num3,num4,num5,num6){
        //     console.log(arguments);
        // }

        // alert(test1.length); // 6



        // 封装函数  
        function Currying(fn, ...outer) {
            // 第一个 fn 是功能函数  判断参数个数是否够  如果够了返回字符串 不够继续输入
            // ...args 收集参数 
            let _arg = outer || []; // 保存外部变量 
            const len = fn.length; // fn形参的个数
            // console.log(len);
            return function (...inner) {
                _arg = [..._arg, ...inner];  // 下次传递的参数 要拼接在上一次传递的后边
                console.log(_arg);
                // _arg 就是传递的参数 
                // 数组的长度是否小于len
                if (_arg.length < len) {
                    // 继续传递 
                    return Currying(fn, ..._arg);
                }
                else {
                    // 功能函数指定的结果要返回 
                    return fn(..._arg)
                }
            }
        }

        function fn1(one, two, three, four) {
            return one + '://' + two + ':' + three + '/' + four;
        }


        // 提前准备三个参数 
        var res = Currying(fn1, 'https', 'www.baidu.com', '8888'); // 得到一个函数 
        // console.log(res('html5'));
        // console.log(res('java'));
        console.log(res('python'));
        // console.log(res('c++'));
        // console.log(res('swift'));





        // 提前准备二个参数     
        // var res = Currying(fn1,'https','www.baidu.com'); // 得到一个函数 
        // // console.log(res('8899')); // 因为不够4个返回一个函数让你继续收集
        // console.log(res('8899')('html5'));// 4个够了 返回功能函数的结果 
        // // https://www.baidu.com:8899/html5
        // 提前准备一个参数  
        // var res = Currying(fn1,'https');
        // console.log(res('www.baidu.com')('8890')('html5'));
        // 提前准备0个参数  
        // var res = Currying(fn1); // 返回一个函数 

        // console.log(res('https')('www.qfedu.com')('8890')('html5'));
        // // 如果没有达到4个参数  返回Currying 继续收集 
        //  // 如果达到4个参数  返回功能函数的结果 



        // add(1);  // 1
        // add(1)(2); // 3
        // add(1)(2)(3) // 6



        //         function add(x){
        //             let sum = x; // 准备一个变量 存放第一个参数 
        //             function inner(y){  // 内部函数 
        //                 sum += y;   // 第一参数基础上 累加第二个参数 
        //                 return inner;  // 目的是继续传递参数 
        //             }
        //             inner.toString = function(){  // 返回结果 
        //                 return sum;
        //             }

        //             return inner;
        //         }


        // console.log(add(1)(2)(3).toString());
        // console.log(add(1).toString());

        // console.log(add(1)(2)(3)(4).toString());





    </script>
</body>

</html>